package com.woniu.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.entity.AllUser;
import com.woniu.mapper.AllUserMapper;
import com.woniu.service.AllUserService;
import com.woniu.utils.UploadMinioUtil;
import jakarta.annotation.Resource;
import org.springframework.http.codec.multipart.FilePart;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;

/**
 * @Author 陈华庆
 * @Date 2025/6/12 10:53
 * @Description TODO
 * AllUserService实现类
 * 继承ServiceImpl获取基础实现，同时注入mapper操作数据库
 * 使用@Service注解标记为Spring Bean，便于Controller注入
 **/
@Service
public class AllUserServiceImpl extends ServiceImpl<AllUserMapper, AllUser> implements AllUserService {

    /**
     * 注入Mapper而非在Controller中直接注入，符合分层架构思想
     * Service层负责业务逻辑，Controller只负责请求处理
     */
    @Resource
    private AllUserMapper allUserMapper;
    @Resource
    private UploadMinioUtil uploadMinioUtil;

    @Override
    public List<AllUser> listByIds(Collection<? extends Serializable> userIds) {
        return super.listByIds(userIds); // 正确调用父类方法，避免死循环
    }

    /**
     * 创建搜索查询条件
     * 将复杂的查询条件封装在Service层，便于复用和维护
     * @param keyword 搜索关键词
     * @return 查询条件包装器
     */
    @Override
    public QueryWrapper<AllUser> createSearchQueryWrapper(String keyword) {
        QueryWrapper<AllUser> wrapper = new QueryWrapper<>();
        wrapper.like("user_name", keyword)      // 用户名模糊查询
                .or().like("nickname", keyword)   // 昵称模糊查询
                .or().like("contact", keyword)    // 联系电话模糊查询
                .or().like("creator", keyword);   // 创建人模糊查询
        return wrapper;
    }

    /**
     * 根据用户ID获取角色ID
     * 实现Service接口中的方法，供SaToken权限验证使用
     * 直接使用MyBatis-Plus提供的getById方法，无需重复编写SQL
     * @param userId 用户ID
     * @return 角色ID，若用户不存在则返回null
     */
    @Override
    public Integer getRoleIdByUserId(Integer userId) {
        // 调用MyBatis-Plus提供的getById方法查询用户信息
        AllUser user = getById(userId);
        // 返回用户的角色ID，若用户不存在则返回null
        return user != null ? user.getRoleId() : null;
    }

    /**
     * 软删除用户实现
     * 通过更新is_delete字段为1和设置delete_time实现逻辑删除
     * 保留数据记录，便于数据恢复和审计追踪
     * @param id 用户ID
     * @return 是否删除成功
     */
    @Override
    public boolean softDeleteById(Integer id) {
        // 创建用户对象用于更新操作
        AllUser user = new AllUser();
        user.setUserId(id);
        // 设置删除标记为1（已删除）
        user.setIsDelete("1");
        // 记录删除时间，便于追踪
        user.setDeleteTime(new Date());
        // 调用updateById方法执行更新操作
        return updateById(user);
    }
    @Override
    public String uploadAvatar(Integer id, FilePart filePart) {
        // 使用 UploadMinioUtil 上传文件并获取预签名 URL
        Mono<String> urlMono = uploadMinioUtil.addDocuments(filePart);
        String avatarUrl = urlMono.block(); // 等待上传完成获取 URL

        // 更新用户头像字段
        AllUser user = new AllUser();
        user.setUserId(id);
        user.setAvatarUrl(avatarUrl);
        user.setUpdateTime(new Date()); // 更新时间
        updateById(user); // 使用 MyBatis-Plus 更新数据库记录

        return avatarUrl;
    }
    //查电话号码是否存在
    @Override
    public AllUser findByPhoneNumber(String contact) {
        // 使用LambdaQueryWrapper进行条件查询
        LambdaQueryWrapper<AllUser> wrapper = Wrappers.<AllUser>lambdaQuery()
                .eq(AllUser::getContact, contact);
        return this.getOne(wrapper);
    }
}